/**
 * 
 */
package org.xlab.baseframework.service.api;

import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;
import org.xlab.baseframework.annotation.Loggable;
import org.xlab.baseframework.domain.ISystemUserDomain;
import org.xlab.baseframework.domain.SystemMessage;
import org.xlab.baseframework.domain.view.SystemMessageVO;
import org.xlab.baseframework.exception.PermissionDeniedException;
import org.xlab.baseframework.exception.SystemMessageAlreadyBeenReadException;
import org.xlab.baseframework.exception.SystemMessageNotFoundException;

/**
 * 系统消息服务接口
 * 
 * @author MaKuBEX
 * 
 */
public interface ISystemMessageService extends
		IBaseService<SystemMessageVO, SystemMessage> {
	/**
	 * 创建一个警告广播
	 * 
	 * @param message
	 *            消息内容
	 * @param startDate
	 *            起始日期
	 * @param endDate
	 *            结束日期
	 * @param createdBy
	 *            创建人
	 */
	@Loggable
	@Transactional
	public void createAlert(String message, Date startDate, Date endDate,
			ISystemUserDomain createdBy);

	/**
	 * 创建一个系统通知
	 * 
	 * @param message
	 *            消息内容
	 * @param destination
	 *            消息目标
	 * @param createdBy
	 *            创建人
	 */
	@Loggable
	@Transactional
	public void createNotification(String message, String destination,
			ISystemUserDomain createdBy);

	/**
	 * 创建多个系统通知
	 * 
	 * @param message
	 *            消息内容
	 * @param destination
	 *            所有消息目标
	 * @param createdBy
	 *            创建人
	 */
	@Loggable
	@Transactional
	public void createNotifications(String message,
			Collection<String> destination, ISystemUserDomain createdBy);

	/**
	 * 按照消息系列号删除整个系列全部消息
	 * 
	 * @param sn
	 *            消息系列号
	 * @param deletedBy
	 *            消息创建人或者Root用户
	 * @throws SystemMessageNotFoundException
	 *             如果系统消息没有被找到
	 * @throws PermissionDeniedException
	 *             如果不是由消息创建人或者Root用户进行删除
	 */
	@Loggable
	@Transactional
	public void deleteNotifications(String sn, ISystemUserDomain deletedBy)
			throws SystemMessageNotFoundException, PermissionDeniedException;

	/**
	 * 删除一个系统消息
	 * 
	 * @param id
	 *            消息主键
	 * @param deletedBy
	 *            消息目标或者Root用户
	 * @throws SystemMessageNotFoundException
	 *             如果系统消息没有被找到
	 * @throws PermissionDeniedException
	 *             如果删除者不是消息目标或者Root用户
	 */
	@Loggable
	@Transactional
	public void deleteSystemMessage(Long id, ISystemUserDomain deletedBy)
			throws SystemMessageNotFoundException, PermissionDeniedException;

	/**
	 * 根据消息创建人获取全部消息
	 * 
	 * @param createdBy
	 *            消息创建人
	 * @return 消息列表
	 * @throws SystemMessageNotFoundException
	 *             如果没有消息被找到
	 */
	public List<SystemMessage> findAllByCreatedBy(String createdBy)
			throws SystemMessageNotFoundException;

	/**
	 * 根据消息目标获取全部消息
	 * 
	 * @param destination
	 *            消息目标
	 * @return 消息列表
	 * @throws SystemMessageNotFoundException
	 *             如果没有消息被找到
	 */
	public List<SystemMessage> findAllByDestination(String destination)
			throws SystemMessageNotFoundException;

	/**
	 * 根据消息系列号获取全部消息
	 * 
	 * @param serialNumber
	 *            消息系列号
	 * @return 消息列表
	 * @throws SystemMessageNotFoundException
	 *             如果没有消息被找到
	 */
	public List<SystemMessage> findAllBySerialNumber(String serialNumber)
			throws SystemMessageNotFoundException;

	/**
	 * 根据消息主键获取消息实体
	 * 
	 * @param id
	 *            消息主键
	 * @return 消息实体
	 * @throws SystemMessageNotFoundException
	 *             如果系统消息没有被找到
	 */
	public SystemMessage findById(Long id)
			throws SystemMessageNotFoundException;

	/**
	 * 标记为已读
	 * 
	 * @param id
	 *            消息主键
	 * @param updatedBy
	 *            消息目标或者Root用户
	 * @throws SystemMessageNotFoundException
	 *             如果消息没有被找到
	 * @throws SystemMessageAlreadyBeenReadException
	 *             如果消息已经被标记为已读
	 * @throws PermissionDeniedException
	 *             如果标记人不是消息目标或者Root用户
	 */
	@Loggable
	@Transactional
	public void markRead(Long id, ISystemUserDomain updatedBy)
			throws SystemMessageNotFoundException,
			SystemMessageAlreadyBeenReadException, PermissionDeniedException;

}
